﻿// 603 大富翁游戏.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
http://oj.daimayuan.top/course/7/problem/494


有 n个人在玩大富翁游戏，每个人初始都有 100块钱。

随着游戏轮次的进行，每个人拥有的资金会有所变动。每过一些轮次，大家就想知道现在场上拥有最多资金的人的资金数和拥有最少资金的人的资金数。

你需要在每次询问的时候给出答案。

输入格式
第一行两个整数 n,m，代表一共有 n个人和总计 m次资金变动或询问。

接下来 m行，每行读入 1个或 3个整数:

如果第一个数为 1，则表示资金变动，你需要再读入两个数 p和 x
，表示第 p个人的资金增加了 x（x可能为负）；

如果第一个数为 2，则表示询问，你需要输出当前的最大和最小资金数。

输出格式
对于每一次询问，输出一行两个整数表示答案。

样例输入
3 3
1 1 50
1 3 -100
2
样例输出
150 0
数据规模
对于 100%
 的数据，保证 1≤n,m≤100000,1≤p≤n,−100≤x≤100。
*/


#include <iostream>
#include <queue>

using namespace std;


const int N = 100010;
struct PERSON {
	int id, money;
}person[N];

struct cmpGreater {
	bool operator()(struct PERSON& a, struct PERSON& b){
		return a.money < b.money;
	}
};
struct cmpLess {
	bool operator()(struct PERSON& a, struct PERSON& b) {
		return a.money > b.money;
	}
};

priority_queue<struct PERSON,vector<struct PERSON>, cmpGreater> qg;
priority_queue<struct PERSON, vector<struct PERSON>, cmpLess> ql;
int n, m;


int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		person[i].money = 100;
		person[i].id = i;
		qg.push(person[i]);
		ql.push(person[i]);
	}

	for (int i = 0; i < m; i++) {
		int t; cin >> t;
		if (t == 1) {
			int id, cnt;
			cin >> id >> cnt;
			person[id].money += cnt;
			if (qg.top().id == id) qg.pop();
			if (ql.top().id == id) ql.pop();
			qg.push(person[id]);
			ql.push(person[id]);
		}
		else {
			while (!qg.empty()) {
				if (qg.top().money != person[qg.top().id].money) qg.pop();
				else break;
			}
			while (!ql.empty()) {
				if (ql.top().money != person[ql.top().id].money) ql.pop();
				else break;
			}
			cout << qg.top().money << " " << ql.top().money << endl;
		}
	}
	 

	return 0;
}

 